package com.dream.libxrec.encode.audio;

import android.content.Context;
import android.media.MediaCodec;
import android.media.MediaFormat;
import android.os.Bundle;
import android.util.Log;

public class AMREncoder extends IAudioMediaCodecEncoder{

    private final static String TAG = "AMREncoder";

    private static final String KEY_EXTRA_AMR_TYPE =
            "KEY_EXTRA_AMR_TYPE";
    public static final String AMR_TYPE_WB = MediaFormat.MIMETYPE_AUDIO_AMR_WB;
    public static final String AMR_TYPE_NB =
            MediaFormat.MIMETYPE_AUDIO_AMR_NB;

    /**
     *
     * @param ct
     * @param sampleRate PCM数据的采样率，AMR-NB的采样率固定为8000,
     *                   AMR-WB固定为1600，如果NB格式下如果设置采样率为16000
     *                   ，解码的时候也会发现采样率是8000，播放时音频处于慢放状态
     *
     * @param codecBitRate AMR-WB的码率范围为 6600 ~ 23850，
     *                     码率等级分为：6600，8850，12650，14250，15850
     *                     ，18250，19850，23050，23850
     *
     *                     AMR-NB的码率范围为4750 ~ 12200。
     *                     码率等级分为：4750，5150，5900，6700，7400
     *      *                     ，7950，10200，12200
     * @param channelNum 通道数（1或2）
     * @param extra
     *    KEY: KEY_EXTRA_AMR_TYPE
     *    VALUE:
     *      AMR_TYPE_NB:压缩比较大，相对其他压缩格式质量比较差，多用于人声，通话录音。
     *      AMR_TYPE_WB:声音质量更好，抗干扰能力更强，相对NB，算法更复炸，对硬件资源的要求也更高
     *
     * @return
     */
    @Override
    public IAudioEncoder init(Context ct, int sampleRate,
                              int codecBitRate, int channelNum,
                              Bundle extra) {

        String type = extra.getString(KEY_EXTRA_AMR_TYPE,AMR_TYPE_WB);
        return init(ct, sampleRate, codecBitRate, channelNum,type);
    }

    /**
     *
     * @param ct
     * @param sampleRate PCM数据的采样率，AMR-NB的采样率固定为8000,
     *                   AMR-WB固定为1600，如果NB格式下如果设置采样率为16000
     *                   ，解码的时候也会发现采样率是8000，播放时音频处于慢放状态
     *
     * @param bitrate AMR-WB的码率范围为 6600 ~ 23850，
     *                     码率等级分为：6600，8850，12650，14250，15850
     *                     ，18250，19850，23050，23850
     *
     *                     AMR-NB的码率范围为4750 ~ 12200。
     *                     码率等级分为：4750，5150，5900，6700，7400
     *      *                     ，7950，10200，12200
     * @param channelNum 通道数（1或2）
     * @param amrType
     *      AMR_TYPE_NB:压缩比较大，相对其他压缩格式质量比较差，多用于人声，通话录音。
     *      AMR_TYPE_WB:声音质量更好，抗干扰能力更强，相对NB，算法更复炸，对硬件资源的要求也更高
     *
     * @return
     */
    public IAudioEncoder init(Context ct,final int sampleRate,
                              int bitrate,
                              final int channelNum,
                              final String amrType){

        mEncoderFormat =
                MediaFormat.createAudioFormat(amrType,
                        sampleRate, channelNum);

        //提示一下采样率问题，但不作中断，因为严格意义来说，实际上只要约定好了播放的参数，这样编码也是没问题的
        if (amrType.equals(AMR_TYPE_NB)){
            if (sampleRate != 8000) {
                Log.e(TAG, "amr-nb格式的采样率固定为8000,当前设置为" + sampleRate +
                        "可能会导致后续解码播放有问题！");
            }

            if (bitrate < 4750){
                bitrate = 4750;
            }else if (bitrate > 12200){
                bitrate = 12200;
            }
        }else{
            if (sampleRate != 16000) {
                Log.e(TAG,
                        "amr-wb格式的采样率固定为16000,当前设置为" + sampleRate +
                        "可能会导致后续解码播放有问题！");
            }

            if (bitrate < 6600){
                bitrate = 6600;
            }else if (bitrate > 23850){
                bitrate = 23850;
            }
        }

        //AMR的码率范围为：6.6kb/s到23.85kb/s
        mEncoderFormat.setInteger(MediaFormat.KEY_BIT_RATE,
                bitrate);//码率

        mEncoderFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 4096);

        try {
            mEncoder = MediaCodec.createEncoderByType(amrType);
        }catch (Exception e){
            e.printStackTrace();
        }
        return this;
    }
}